/**
 * Event Bus (事件总线) 实现
 * 
 * 事件总线是一种发布-订阅模式的设计模式，用于组件间的解耦通信。
 * 它允许组件之间通过事件进行通信，而不需要直接引用。
 * 
 * 时间复杂度：
 * - 订阅: O(1)
 * - 发布: O(n) - n为订阅者数量
 * - 取消订阅: O(1)
 * 
 * 空间复杂度: O(n) - n为事件数量
 */

class EventBus {
  constructor() {
    // TODO: 初始化事件总线
    // this.events = new Map()
    // this.maxListeners = 10
    // this.warnOnce = true
  }

  /**
   * 订阅事件
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   * @param {Object} options - 选项
   * @returns {Function} - 取消订阅函数
   */
  on(event, callback, options = {}) {
    // TODO: 实现事件订阅
    // 1. 验证参数
    // 2. 检查监听器数量限制
    // 3. 添加事件监听器
    // 4. 返回取消订阅函数
  }

  /**
   * 发布事件
   * @param {string} event - 事件名称
   * @param {...any} args - 事件参数
   * @returns {boolean} - 是否有监听器
   */
  emit(event, ...args) {
    // TODO: 实现事件发布
    // 1. 获取事件监听器
    // 2. 执行所有监听器
    // 3. 处理错误
    // 4. 返回是否有监听器
  }

  /**
   * 取消订阅
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   * @returns {boolean} - 是否成功取消
   */
  off(event, callback) {
    // TODO: 实现取消订阅
    // 1. 获取事件监听器
    // 2. 移除指定监听器
    // 3. 清理空事件
    // 4. 返回是否成功
  }

  /**
   * 一次性订阅
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   * @returns {Function} - 取消订阅函数
   */
  once(event, callback) {
    // TODO: 实现一次性订阅
    // 1. 创建包装函数
    // 2. 包装函数执行后自动取消订阅
    // 3. 返回取消订阅函数
  }

  /**
   * 移除所有监听器
   * @param {string} event - 事件名称
   */
  removeAllListeners(event) {
    // TODO: 移除所有监听器
    // 1. 如果指定事件，移除该事件的所有监听器
    // 2. 如果未指定事件，移除所有事件的监听器
  }

  /**
   * 获取事件监听器数量
   * @param {string} event - 事件名称
   * @returns {number} - 监听器数量
   */
  listenerCount(event) {
    // TODO: 获取监听器数量
    // 1. 如果指定事件，返回该事件的监听器数量
    // 2. 如果未指定事件，返回所有事件的监听器总数
  }

  /**
   * 获取所有事件名称
   * @returns {string[]} - 事件名称数组
   */
  eventNames() {
    // TODO: 获取所有事件名称
    // 1. 返回所有已注册的事件名称
  }

  /**
   * 设置最大监听器数量
   * @param {number} max - 最大数量
   */
  setMaxListeners(max) {
    // TODO: 设置最大监听器数量
    // 1. 验证参数
    // 2. 设置最大监听器数量
  }

  /**
   * 获取最大监听器数量
   * @returns {number} - 最大数量
   */
  getMaxListeners() {
    // TODO: 获取最大监听器数量
    // 1. 返回当前设置的最大监听器数量
  }

  /**
   * 检查是否有监听器
   * @param {string} event - 事件名称
   * @returns {boolean} - 是否有监听器
   */
  hasListeners(event) {
    // TODO: 检查是否有监听器
    // 1. 检查指定事件是否有监听器
  }
}

module.exports = EventBus
